import { parsePath } from '../util/lang'
import Dep from './dep'

export default class Watcher {
  // 这是定义实例属性
  vm
  getter
  cb
  value

  // 假设：exp ==> user.parent.name
  constructor(vm, exp, cb) {
    this.vm = vm
    this.cb = cb
    this.getter = parsePath(exp)
    // 存储初始值
    this.value = this.get()
  }

  get() {
    // this 就是当前的 watcher 实例
    Dep.target = this
    const value = this.getter(this.vm) // 这个会触发对应数据的 get 劫持函数
    console.log('getter 执行 over')
    Dep.target = null
    return value
  }

  // 我依赖某个 数据，请把我添加到 这个数据对应的 dep 的依赖列表中
  addDep(dep) {
    // this ==> 当前的 Watcher 实例
    dep.addSub(this)
  }

  update() {
    this.run()
  }

  run() {
    const oldValue = this.value // 先把旧值拿出来
    const newValue = this.get() // 在获取新值
    this.value = newValue // 再把新值存进来
    this.cb.call(this.vm, newValue, oldValue)
  }
}
